// function add(x) {
//   return (y) => {
//     return x + y;
//   };
// }

// console.log(add(1)(2));

// function check(reg) {
//   return (str) => {
//     return reg.test(str);
//   };
// }

// const checkNumber = check(/\d+/g);

// const checkStr = check(/[a-z]+/g);

// console.log(checkNumber(123));
// console.log(checkNumber("123"));
// console.log(checkStr("adb123"));

// function curry() {
//   // 获取要执行的函数
//   const fn = arguments[0];
//   // 获取传递的参数，构成一个参数数组
//   const args = [].slice.call(arguments, 1);
//   //如何传递的参数已经等于执行函数所需的参数数量
//   if (args.length === fn.length) {
//     return fn.apply(this, args);
//   }

//   //参数不够向外界返回的函数

//   function _curry() {
//     // 推入之前判断
//     // 将新接收到的参数推入到参数数组中。
//     args.push(...arguments);
//     if (args.length === fn.length) {
//       return fn.apply(this, args);
//     }

//     return _curry;
//   }

//   return _curry;
// }

// function add(a, b, c) {
//   return a + b + c;
// }

// // console.log(curry(add, 1)(2)(3));
// // console.log(curry(add)(2)(3)(1));

// const towPlusAdd = curry(add, 2);

// console.log(towPlusAdd(1, 2));

// function check(reg, str) {
//   return reg.test(str);
// }

// console.log(curry(check, /\d+/g)(123));
// console.log(curry(check, /\D+/g)("qwe"));

// function curry() {
//   const fn = arguments[0];
//   const args = Array.prototype.slice.call(arguments, 1);
//   if (fn.length === args.length) {
//     return fn.apply(this, args);
//   } else {
//     return curry.bind(null, fn, ...args);
//   }
// }

// function add(a, b, c) {
//   return a + b + c;
// }

// console.log(curry(add, 1)(2)(3));
// console.log(curry(add)(1)(2)(3));

// function check(reg, str) {
//   return reg.test(str);
// }

// console.log(curry(check, /\d+/g)(123));
// console.log(curry(check, /[a-z]+/g)("abc"));

// add(1)(2)(3) = 6;
// add(1, 2, 3)(4) = 10;
// add(1)(2)(3)(4)(5) = 15;

console.log(add(1)(2)(3)(5).toString());
function add() {
  const args = Array.prototype.slice.call(arguments);
  function _hanlder() {
    args.push(...arguments);
    return _hanlder;
  }

  _hanlder.toString = function () {
    return args.reduce(function (pre, curr) {
      return pre + curr;
    }, 0);
  };

  return _hanlder;
}
